package class02;

import java.util.HashMap;

/*
 * 题目描述：
 * 设计一个带有setAll功能的HashMap，除了常规的put和get方法外，
 * 还支持setAll方法，可以将所有key的值统一设置为某个值。
 * 
 * 功能要求：
 * 1. put(key, value): 设置某个key对应的值
 * 2. get(key): 获取某个key对应的值
 * 3. setAll(value): 将所有key的值都设置为指定值
 * 
 * 设计思路：
 * 使用时间戳机制来处理setAll操作，避免对每个key进行遍历修改。
 * 每个key-value对都带有一个时间戳，setAll操作也带有一个时间戳。
 * get操作时比较key-value对的时间戳和setAll的时间戳，返回较新的值。
 */
public class Code05_SetAll {

	public static class MyValue<V> {
		public V value;
		public long time;

		public MyValue(V v, long t) {
			value = v;
			time = t;
		}
	}

	public static class MyHashMap<K, V> {
		private HashMap<K, MyValue<V>> map;
		private long time;
		private MyValue<V> setAll;

		public MyHashMap() {
			map = new HashMap<>();
			time = 0;
			setAll = new MyValue<V>(null, -1);
		}

		// 插入或更新一个键值对，同时记录操作时间
		public void put(K key, V value) {
			map.put(key, new MyValue<V>(value, time++));
		}

		// 设置所有键的值为指定值，同时记录操作时间
		public void setAll(V value) {
			setAll = new MyValue<V>(value, time++);
		}

		// 获取指定键的值
		// 如果该键最后一次更新的时间晚于setAll操作的时间，则返回该键的值
		// 否则返回setAll设置的值
		public V get(K key) {
			if (!map.containsKey(key)) {
				return null;
			}
			if (map.get(key).time > setAll.time) {
				return map.get(key).value;
			} else {
				return setAll.value;
			}
		}
	}

}